#include "S1.h"

uint8_t KEY_values[6];


/*********************************************************************************************
函数名:    s1_init
入口参数:  address:S1子板的i2c起始地址
出口参数： 无
返回值：   初始化后的i2c地址结构体，如果初始化成功则结构体中的flag为1
作者：     XQii
日期:      2023/4/24
调用描述:  初始化指定的S1子板
**********************************************************************************************/
i2c_addr_def s1_init(uint8_t address)
{
    uint8_t i;
    i2c_addr_def result;
    /*get s1 i2c_addr*/
    for (i = 0; i < 4; ++i)
    {
        result = get_board_address(address);

        /*write cmd to i2cx to enable s1*/
        if (result.flag == 1)
            i2c_cmd_write(result.periph, result.addr, SYSTEM_ON_S1);

        /*return i2c_addr_def struct*/
    }

    return result;
}


/*********************************************************************************************
函数名:    s1_all_init
入口参数:  s1_address:指向所有S1子板的结构体指针  s1_addr:S1子板中的HT16K33芯片的基地址
出口参数： 无
返回值：   无
作者：     XQii
日期:      2023/4/24
调用描述:  初始化所有的S1子板
**********************************************************************************************/
void s1_all_init(i2c_addr_def *s1_address, uint8_t s1_addr)
{
    uint8_t i;

    for (i = 0; i < 4; ++i)
    {
        /*get s1 i2c_addr*/
        s1_address[i] = get_board_address(s1_addr + i * 2);

        /*initiate s1 if flag bit is 1*/
        if (s1_address[i].flag == 1)
        {
            i2c_cmd_write(s1_address[i].periph, SYSTEM_ON_S1, s1_address->addr);
        }
    }
}


/*********************************************************************************************
函数名:    key_trans
入口参数:  KEY_addr:S1子板的I2C地址结构体
出口参数： 无
返回值：   有效的按键编号
作者：     XQii
日期:      2023/4/24
调用描述:  扫描键盘中哪个按键有效
**********************************************************************************************/
uint8_t key_trans(i2c_addr_def KEY_addr)//Translation from Array to Key number
{
    i2c_read(KEY_addr.periph, KEY_addr.addr, KEYKS0, KEY_values, 6);//get key status

    if (KEY_values[0] & 0x01) {
        return 1;
    } else if (KEY_values[2] & 0x01) {
        return 2;
    } else if (KEY_values[4] & 0x01) {
        return 3;
    } else if (KEY_values[0] & 0x02) {
        return 4;
    } else if (KEY_values[2] & 0x02) {
        return 5;
    } else if (KEY_values[4] & 0x02) {
        return 6;
    } else if (KEY_values[0] & 0x04) {
        return 7;
    } else if (KEY_values[2] & 0x04) {
        return 8;
    } else if (KEY_values[4] & 0x04) {
        return 9;
    } else if (KEY_values[0] & 0x08) {
        return 10;
    } else if (KEY_values[2] & 0x08) {
        return 11;
    } else if (KEY_values[4] & 0x08) {
        return 12;
    }
    return 0;
}
